from .load import load_img
from src.position.center import center_handler
from src import window
import pygame


def draw_img(img, position=(0, 0), size=None, is_h_center=False, is_v_center=False, is_transparent=False):
    """
    在窗口中绘制图片
    :param img: 图片，如果传递进来的是图片路径字符串，则会先加载图片在绘制，否之直接绘制
    :param position: 图片在窗口中的位置，默认值 (0, 0)
    :param size: 图片的大小，参数需要的类型为元组 (width, height)，默认值为 None，即默认图片大小为图片的像素大小
    :param is_h_center: 图片在窗口中的位置是否水平方向上居中，默认值 False
    :param is_v_center: 图片在窗口中的位置是否垂直方向上居中，默认值 False
    :param is_transparent: 图片是否为背景透明的图片，默认值 False
    :return: 绘制到窗口中的图片对象和图片对象对应的 Rect 对象组成的元组
    """
    # 图片对象
    img_obj = None
    # 图片 Rect 对象
    img_rect = None
    # 如果传递进来的是图片路径字符串
    if isinstance(img, str):
        img_obj = load_img(img, is_transparent)
    else:
        img_obj = img
    # 对图片在窗口中的位置进行居中处理
    position = center_handler(img_obj, window.win, position, is_h_center, is_v_center)
    # 如果没有指定图片的大小，直接在窗口中绘制图片
    if size is None:
        img_rect = window.win.blit(img_obj, position)
    # 如果指定了图片的大小，先在 Surface 中绘制图片，再将 Surface 绘制到窗口中
    else:
        # 创建 Surface 对象
        img_canvas = pygame.Surface(size)
        # 设置 Surface 背景透明
        img_canvas.set_colorkey((0, 0, 0, 0))
        # 绘制图片
        img_canvas.blit(img_obj, (0, 0))
        # 更新图片对象
        img_obj = img_canvas
        # 将 Surface 绘制到窗口中
        img_rect = window.win.blit(img_canvas, position)
    return img_obj, img_rect


def draw_img_with_pre_handle(img, position=(0, 0), size=None, is_h_center=False, is_v_center=False, is_transparent=True,
                             img_draw_to_win_pre_handler=None):
    """
    在窗口中绘制图片
    :param img: 图片，如果传递进来的是图片路径字符串，则会先加载图片在绘制，否之直接绘制
    :param position: 图片在窗口中的位置，默认值 (0, 0)
    :param size: 图片的大小，参数需要的类型为元组 (width, height)，默认值为 None，即默认图片大小为图片的像素大小
    :param is_h_center: 图片在窗口中的位置是否水平方向上居中，默认值 False
    :param is_v_center: 图片在窗口中的位置是否垂直方向上居中，默认值 False
    :param is_transparent: 图片是否为背景透明的图片，默认值 False
    :param img_draw_to_win_pre_handler: 图片绘制到窗口前的处理函数
    :return: 绘制到窗口中的图片对象和图片对象对应的 Rect 对象组成的元组
    """
    # 图片对象
    img_obj = None
    # 图片 Rect 对象
    img_rect = None
    # 如果传递进来的是图片路径字符串
    if isinstance(img, str):
        img_obj = load_img(img, is_transparent)
    else:
        img_obj = img
    # 对图片在窗口中的位置进行居中处理
    position = center_handler(img_obj, window.win, position, is_h_center, is_v_center)
    # 图片大小
    img_size = size
    # 如果没有指定图片的绘制大小，则为图片本身的大小
    if img_size is None:
        img_size = (img_obj.get_width(), img_obj.get_height())
    # 创建 Surface 对象
    img_canvas = pygame.Surface(img_size)
    # 设置 Surface 背景透明
    img_canvas.set_colorkey((0, 0, 0, 0))
    # 绘制图片到 Surface 中
    img_canvas.blit(img_obj, (0, 0))
    # 更新图片对象
    img_obj = img_canvas
    # 如果图片绘制到窗口前的处理函数不为空
    if img_draw_to_win_pre_handler is not None:
        img_draw_to_win_pre_handler(img_obj, img_size)
    # 将 Surface 绘制到窗口中
    img_rect = window.win.blit(img_canvas, position)
    return img_obj, img_rect
